vscode 自己实现补全提示插件

vscode 自己实现补全提示插件

点点

2021-04-18 19:34 阅读 860 喜欢 1

功能

实现一个vs code 的插件,用于thinkjs 多模块下的model的函数提示,类似以下。

文档

官方文档 : https://code.visualstudio.com/api 官方demo : https://github.com/microsoft/vscode-extension-samples 就大部分简易插件来说,看下官方文档+demo,基本就差不多了,如果还需要一些更加深入的实现,就需要详细看api了。

按照文档进行准备

需要安装一些脚手架或打包工具。

脚手架命令

//然后生成后,直接 code ./demo ,按F5 调试。 打包工具

打包命令

代码

文件总共有两个:package.json ,extension.js

package.json

{ "name": "completions-sample", "displayName": "Completion Item Provider Sample", "version": "0.0.2", "publisher": "chrunlee", "engines": { "vscode": "^1.32.0" }, "categories": [ "Other" ], "activationEvents": [ "*" ], "main": "extension.js" } extension.js

/**

const vscode = require('vscode'); const path = require('path'); const fs = require('fs'); const vm = require('vm');

module.exports.activate = function activate(context) {

const provider2 = vscode.languages.registerCompletionItemProvider(
    'javascript',
    {
        provideCompletionItems(document, position) {

            // get all text until the `position` and check if it reads `console.`
            // and if so then complete if `log`, `warn`, and `error`
            const linePrefix = document.lineAt(position).text.substr(0, position.character);
            //当符合 this.model(.*). 的时候出发
            if(!/this\.model\([\s\S]*\)\.$/.test(linePrefix)){
                return undefined;
            }

            //匹配出路径
            const fileName = document.fileName;
            //根据fileName 查找
            let rootPath = fileName.substr(0,fileName.indexOf('src'));
            if(!rootPath){
                return undefined;
            }
            let srcPath = path.join(rootPath,'src');
            //扫描该路径下所有model文件夹,直到查找到目标位置。
            let rst = /model\((.*)\)/.exec(linePrefix)[1];
            let finalPath = '';
            if(rst.indexOf(',') >-1){//多级模块
                let arr = rst.split(',');
                let moduleName = arr[2].replace(/'/g,'').trim();
                let modelName = arr[0].replace(/'/g,'').trim();
                finalPath = path.join(srcPath,moduleName,'model',modelName+'.js');
            }else{
                let modelName = rst.replace(/'/g,'').trim();
                finalPath = path.join(srcPath,'model',modelName+'.js');
            }
            console.log(finalPath);
            //解析js文件 ,获取内部函数数据
            if(fs.existsSync(finalPath)){
                let content = fs.readFileSync(finalPath).toString('utf8');
                let list = content.split('\r\n');

                return list.filter(t=>{
                    return t.indexOf('async') > -1;
                }).map(function(t){
                    return t.replace('async','').replace('{','').trim();
                }).map(t=>{
                    return vscode.CompletionItem(t,vscode.CompletionItemKind.Method);
                })

            }else{
                return undefined;
            }

        }
    },
    '.' // triggered whenever a '.' is being typed
);

context.subscriptions.push(provider2);

}

说明

本插件自用,所以做的校验很粗糙,基本上只符合自己的文档目录体系。 至于获取函数.. 这个没有找到,应该是vm方面的知识,虽然经常用nodejs ,但是vm 实在没啥接触,也卡了壳了,直接用字符串去识别了。

打包后安装

选择打包后的vsix ,安装成功,然后试了试,感觉还是可以的 。

转载请注明出处: http://sdxlp.cn/article/vs code.html


如果对你有用的话,请赏给作者一个馒头吧 ...或帮点下页面底部的广告,感谢!!

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
小伙伴们都知道百度网盘是一个功能十分齐全的网盘工具,可以说这里面能存储的内容有很多,除了文件、图片等,还能起到一个备份作用。那么百度网盘可以备份我们的聊天记录吗?
现如今手机成为了每个人的必备之物,随着现在的手机越来越智能,手机的功能越来越多,但是手机的内存越永远也跟不上我们使用的节奏,因为手机的内存越大意味着价格也就越高,就算是再大的内存,也会有使用到不足的时候,而当手机的内存不够用的时候,我们往往就会清理手机里存储的大量照片。
苹果12app下载不了软件怎么办?IPhone12App Store下载不了东西?在使用IPhone12手机时,出现App Store应用商店无法下载软件的情况时,该怎么解决这种问题呢,苹果12app下载不了软件怎么办,怎么解决IPhone 12Apple Store下载不了东西问题,下面就和点点一起来看看吧!
这几天很多小伙伴们私信点点,问点点这个问题,今天点点就给小伙伴们写了一篇关于安卓系统和苹果系统怎么查看微信撤回消息的文章,希望小伙伴们喜欢,不过好奇害死猫啊!要慎重的去看这个事情。
日常生活中,咱们有好多用微信的小伙伴会收到好多好多的广告,那怎样去关闭哪?让我们减轻烦恼,跟点点来看看吧!
苹果12怎么打开5G?IPhone12系列全部支持5G网络,那我们在使用苹果12手机时,该怎么打开5G网络呢,苹果12怎么打开5G,IPhone125G怎么打开,下面就和点点一起来看看吧!
手机是我们日常生活中常用的生活工具,那么手机微信是我们大多数小伙伴们常用的支付应用,同时也是国民社交应用,在使用微信支付时经常会开通一些自动续费扣费的业务,忘记后会自动扣费续订,那我们怎么关闭微信的自动扣费业务呢?
现如今电脑手机太过普遍,很多小伙伴们都是需要隐私的,有可能是重要的要常使用,相信小伙伴们都知道都知道微软系统为了安全考虑会隐藏一些文件和文件夹,以防止误删,有些时候咱们也可以为了隐藏一些私密数据采取隐藏的方式,需要藏哪个就要先学会怎样查看啦!那么Win10正式版怎么显示隐藏文件/文件夹,下面点点就给小伙伴们带来win10显示隐藏文件/文件夹方法。